import 'package:flutter/cupertino.dart';
import 'package:boxes_flutter/flutter/slc/dialog/dialog_loading_vm.dart';
import 'package:boxes_flutter/gen/boxes_l10n.dart';
import 'package:provider/provider.dart';

/// @author: slc
/// 一个用于显示不同加载状态的状态小部件混入。
mixin StatusWidget<T extends IStatusVm> {
  /// 返回一个根据加载状态显示不同内容的小部件。
  ///
  /// [context] 参数是构建上下文。
  /// [params] 参数是一个可选的参数映射。
  Widget getStatusBody(BuildContext context, {Map<String, dynamic>? params}) {
    return Selector<T, LoadingStatus>(
      builder: (context, value, child) {
        if (value == LoadingStatus.loading) {
          return getLoadingWidget(context, params: params);
        } else if (value == LoadingStatus.success) {
          return getSuccessWidget(context, params: params);
        } else if (value == LoadingStatus.fail) {
          return getFailWidget(context, params: params);
        }
        return Center(child: Text(Boxes.of(context).label_unknown_state));
      },
      selector: (context, vm) {
        return vm.getLoadingStatus();
      },
      shouldRebuild: (previous, next) {
        return previous != next;
      },
    );
  }

  /// 返回一个在加载状态时显示的小部件。
  ///
  /// [context] 参数是构建上下文。
  /// [params] 参数是一个可选的参数映射。
  Widget getLoadingWidget(BuildContext context, {Map<String, dynamic>? params}) {
    return LoadingView(text: Boxes.of(context).label_loading);
  }

  /// 返回一个在成功状态时显示的小部件。
  ///
  /// [context] 参数是构建上下文。
  /// [params] 参数是一个可选的参数映射。
  Widget getSuccessWidget(BuildContext context, {Map<String, dynamic>? params}) {
    return Center(child: Text(Boxes.of(context).label_please_improve));
  }

  /// 返回一个在失败状态时显示的小部件。
  ///
  /// [context] 参数是构建上下文。
  /// [params] 参数是一个可选的参数映射。
  Widget getFailWidget(BuildContext context, {Map<String, dynamic>? params}) {
    // 暂时先用这个
    return Center(child: Text(Boxes.of(context).label_loading_failure));
  }
}

/// 一个实现了 [IStatusVm] 接口的视图模型。
class StatusVm implements IStatusVm {
  LoadingStatus _loadingStatus = LoadingStatus.loading;

  @override
  LoadingStatus getLoadingStatus() {
    return _loadingStatus;
  }

  @override
  void setLoadingStatus(LoadingStatus status) {
    if (status == _loadingStatus) {
      return;
    }
    _loadingStatus = status;
  }
}

/// 一个状态视图模型的接口。
abstract class IStatusVm {
  /// 返回当前的加载状态。
  LoadingStatus getLoadingStatus();

  /// 设置加载状态。
  ///
  /// [status] 参数是新的加载状态。
  void setLoadingStatus(LoadingStatus status);
}

/// 一个表示不同加载状态的枚举。
enum LoadingStatus { loading, success, fail }
